package d3_recursion;

import java.io.File;
import java.io.IOException;

public class FileSearch {
    public static void main(String[] args) throws IOException {
        // 目标: 文件搜索   --的是老师的注释
        //独立功能, 独立成方法
        File file = new File("D:/");
        //形参列表 -->  搜索的文件夹对象 搜索的文件名
        searchFile(file, "百度翻译_Setup_2.0.0.exe");
    }

    /**
     * 标准注释
     * 文件搜索
     * @param dir  传需要查询的目录
     * @param fileName 传需要查询的文件名
     * @throws IOException
     */
    public static void searchFile(File dir, String fileName) throws IOException {

        //1、极端判断
        //--1、极端情况判断
        if (dir == null || !dir.exists() || dir.isFile() || fileName == null) {
            //不搜索的情况
            return;
        }
        //2、用户思维
        //提取当前文件夹
        //-- 2、拿当前目录下的全部一级文件对象。
        File[] files = dir.listFiles();//获取当前目录下的所有"一级文件对象"到一个文件对象数组中去

        //3、判断这个文件夹是否可以提取一级文件对象, 以及是否存在文件对象,才开始搜索, 存在机开始搜索
        //避免出现nullPointerException
        //当一个是文件夹, 但是没有权限访问文件夹时, 返回null
        if (files == null || files.length == 0) {
           /* System.out.println(files.length);
            System.out.println(files);*/
            //直接进行终结方法
            return;
        }
        //到这里证明,有权限进行访问,且有一级文件对象
        //4、遍历一级文件对象数组
        //-- 3、遍历当前每个一级文件对象
        for (File file : files) {
            //判断是否是文件还是文件夹
            // --4、判断f对应的文件对象是文件，还是文件夹

            if (file.isFile()) {
                if (file.getName().contains(fileName)) {
                    //是就输出该路径
                    System.out.println(file.getAbsolutePath());
                    //找到并启动
                    Runtime r = Runtime.getRuntime();
                    r.exec(file.getAbsolutePath());

                }
            } else {
                //继续进行搜索
                // --6、如果是文件夹，递归进入继续寻找
                searchFile(file, fileName);
            }
        }

    }


    /**
     * 这是标准注释
     */

    //只要包含这个文件名,就认为这个文件就是我想要的,就会把路径进行输出(其实大多数搜索都是这样)
    //不懂是就使用, 用户思维, 没有技巧-->用户咋想,你就咋写 --> 一条路走到黑, 车到山前必有路

}
